﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace CsharpStats.Utils
{
    public class FileProcessor
    {
        // 统计原始行数
        public int OriginalLineCount { get; private set; }

        // 统计原始单词数
        public int OriginalWordCount { get; private set; }

        // 统计格式化后行数
        public int FormattedLineCount { get; private set; }

        // 统计格式化后单词数
        public int FormattedWordCount { get; private set; }

        // 原始文本
        private List<string> originalLines = new List<string>();

        // 格式化后的文本
        private List<string> formattedLines = new List<string>();

        // 读取文件并统计原始数据
        public string[] ReadFile(string path)
        {
            try
            {
                originalLines.Clear();
                // 读取文件
                string[] lines = System.IO.File.ReadAllLines(path);
                originalLines.AddRange(lines);
                // 统计原始行数
                OriginalLineCount = lines.Length;
                // 统计原始单词数
                OriginalWordCount = CountWords(lines);
                // 返回读取的内容
                return lines;
            }
            catch (Exception e)
            {
                MessageBox.Show("此文件无法读取：" + e.Message);
                return new string[0];
            }
        }

        // 格式化文本，去掉空行和注释，统计格式化数据
        public string[] FormatFile(string[] lines)
        {
            formattedLines.Clear();
            // 标记是否在注释中
            bool inComment = false;
            foreach (string line in lines)
            {
                // 去掉首尾空格
                string trimmedLine = line.Trim();
                // 如果是空行或者注释行
                if (trimmedLine == "" || trimmedLine.StartsWith("//") || inComment)
                {
                    if (trimmedLine.StartsWith("/*"))
                    {
                        inComment = true;
                    }
                    if (trimmedLine.EndsWith("*/"))
                    {
                        inComment = false;
                    }
                    continue;
                }
                // 如果不是注释行
                formattedLines.Add(trimmedLine);
            }
            // 统计格式化后行数
            FormattedLineCount = formattedLines.Count;
            // 统计格式化后单词数
            FormattedWordCount = CountWords(formattedLines.ToArray());
            // 返回格式化后的内容
            return formattedLines.ToArray();
        }

        // 统计单词数(不含标点符号)
        private int CountWords(string[] lines)
        {
            int wordCount = 0;
            foreach (var line in lines)
            {
                // 使用正则表达式分割单词
                var words = Regex.Split(line, @"\W+")  // \W 匹配任何非单词字符
                    .Where(w => !string.IsNullOrEmpty(w)); // 去掉空单词
                wordCount += words.Count();
            }
            return wordCount;
        }

        // 获取原始文本
        public string GetOriginalText()
        {
            return string.Join("\r\n", originalLines);
        }

        // 获取格式化后的文本
        public string GetFormattedText()
        {
            return string.Join("\r\n", formattedLines);
        }
    }
}
